home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / dcetest.nasl < prev    next >
Text File  |  2005-03-31  |  25KB  |  761 lines

  1. #
  2. # DCEMAP
  3. #
  4. # Does a 'portmap-like' request to the remote host, to
  5. # to determine what DCE/MS RPC services are running.
  6. #
  7. # This code is 100% based on 'dcetest', by Dave Aitel, a free (GPL'ed)
  8. # C program available at http://www.immunitysec.com/tools.html
  9. # (or http://www.atstake.com)
  10. #
  11. # NASL translation by Renaud Deraison
  12. # and Pavel Kankovsky, DCIT s.r.o. <kan@dcit.cz>
  13. #
  14. # License: GPLv2
  15. #
  16. # See also:
  17. # CAE Specification, DCE 1.1: Remote Procedure Call, Doc. No. C706
  18. # http://www.opengroup.org/products/publications/catalog/c706.htm
  19. #
  20.  
  21. if(description)
  22. {
  23.   script_id(10736);
  24.   script_version("$Revision: 1.19 $");
  25.  
  26.   name["english"] = "DCE Services Enumeration";
  27.   script_name(english:name["english"]);
  28.  
  29.   desc["english"] = "
  30. Distributed Computing Environment (DCE) services running on the remote host 
  31. can be enumerated by connecting on port 135 and doing the appropriate queries. 
  32.  
  33. An attacker may use this fact to gain more knowledge
  34. about the remote host.
  35.  
  36. Solution : filter incoming traffic to this port.
  37. Risk factor : Low";
  38.   script_description(english:desc["english"]);
  39.  
  40.   summary["english"] = "Enumerates the remote DCE services";
  41.   script_summary(english:summary["english"]);
  42.  
  43.   script_category(ACT_GATHER_INFO);
  44.   script_copyright(english:"This script is Copyright (C) 2001 Dave Aitel (ported to NASL by rd and Pavel Kankovsky)");
  45.  
  46.   family["english"] = "Windows";
  47.   script_family(english:family["english"]);
  48.  
  49.   script_dependencie("find_service.nes");
  50.   script_require_ports(135);
  51.  
  52.   exit (0);
  53. }
  54.  
  55. include("misc_func.inc");
  56.  
  57.  
  58. # Ref : http://www.hsc.fr/ressources/articles/win_net_srv/index.html.fr by Jean-Baptiste Marchand
  59. rpc_svc_pipes["1ff70682-0a51-30e8-076d-740be8cee98b"] = "atsvc";
  60. rpc_svc_processes["1ff70682-0a51-30e8-076d-740be8cee98b"] = "mstask.exe";
  61. rpc_svc_name["1ff70682-0a51-30e8-076d-740be8cee98b"] = "Scheduler service";
  62. rpc_svc_pipes["3faf4738-3a21-4307-b46c-fdda9bb8c0d5"] = "AudioSrv";
  63. rpc_svc_processes["3faf4738-3a21-4307-b46c-fdda9bb8c0d5"] = "AudioSrv";
  64. rpc_svc_name["3faf4738-3a21-4307-b46c-fdda9bb8c0d5"] = "Windows Audio service";
  65. rpc_svc_pipes["6bffd098-a112-3610-9833-012892020162"] = "ntsvcs";
  66. rpc_svc_processes["6bffd098-a112-3610-9833-012892020162"] = "Browser";
  67. rpc_svc_name["6bffd098-a112-3610-9833-012892020162"] = "Computer Browser";
  68. rpc_svc_pipes["91ae6020-9e3c-11cf-8d7c-00aa00c091be"] = "cert";
  69. rpc_svc_processes["91ae6020-9e3c-11cf-8d7c-00aa00c091be"] = "certsrv.exe";
  70. rpc_svc_name["91ae6020-9e3c-11cf-8d7c-00aa00c091be"] = "Certificate service";
  71. rpc_svc_pipes["5ca4a760-ebb1-11cf-8611-00a0245420ed"] = "Ctx_WinStation_API_service";
  72. rpc_svc_processes["5ca4a760-ebb1-11cf-8611-00a0245420ed"] = "termsrv.exe";
  73. rpc_svc_name["5ca4a760-ebb1-11cf-8611-00a0245420ed"] = "Terminal Services remote management";
  74. rpc_svc_pipes["c8cb7687-e6d3-11d2-a958-00c04f682e16"] = "DAV RPC SERVICE";
  75. rpc_svc_processes["c8cb7687-e6d3-11d2-a958-00c04f682e16"] = "WebClient";
  76. rpc_svc_name["c8cb7687-e6d3-11d2-a958-00c04f682e16"] = "WebDAV client";
  77. rpc_svc_pipes["50abc2a4-574d-40b3-9d66-ee4fd5fba076"] = "dnsserver";
  78. rpc_svc_processes["50abc2a4-574d-40b3-9d66-ee4fd5fba076"] = "dns.exe";
  79. rpc_svc_name["50abc2a4-574d-40b3-9d66-ee4fd5fba076"] = "DNS Server";
  80. rpc_svc_pipes["e1af8308-5d1f-11c9-91a4-08002b14a0fa"] = "epmapper";
  81. rpc_svc_processes["e1af8308-5d1f-11c9-91a4-08002b14a0fa"] = "RpcSs";
  82. rpc_svc_name["e1af8308-5d1f-11c9-91a4-08002b14a0fa"] = "RPC endpoint mapper";
  83. rpc_svc_pipes["82273fdc-e32a-18c3-3f78-827929dc23ea"] = "ntsvcs";
  84. rpc_svc_processes["82273fdc-e32a-18c3-3f78-827929dc23ea"] = "Eventlog";
  85. rpc_svc_name["82273fdc-e32a-18c3-3f78-827929dc23ea"] = "Eventlog service";
  86. rpc_svc_pipes["3d267954-eeb7-11d1-b94e-00c04fa3080d"] = "HydraLsPipe";
  87. rpc_svc_processes["3d267954-eeb7-11d1-b94e-00c04fa3080d"] = "lserver.exe";
  88. rpc_svc_name["3d267954-eeb7-11d1-b94e-00c04fa3080d"] = "Terminal Server Licensing";
  89. rpc_svc_pipes["894de0c0-0d55-11d3-a322-00c04fa321a1"] = "InitShutdown";
  90. rpc_svc_processes["894de0c0-0d55-11d3-a322-00c04fa321a1"] = "winlogon.exe";
  91. rpc_svc_name["894de0c0-0d55-11d3-a322-00c04fa321a1"] = "(Remote) system shutdown";
  92. rpc_svc_pipes["8d0ffe72-d252-11d0-bf8f-00c04fd9126b"] = "keysvc";
  93. rpc_svc_processes["8d0ffe72-d252-11d0-bf8f-00c04fd9126b"] = "CryptSvc";
  94. rpc_svc_name["8d0ffe72-d252-11d0-bf8f-00c04fd9126b"] = "Cryptographic services";
  95. rpc_svc_pipes["0d72a7d4-6148-11d1-b4aa-00c04fb66ea0"] = "keysvc";
  96. rpc_svc_processes["0d72a7d4-6148-11d1-b4aa-00c04fb66ea0"] = "CryptSvc";
  97. rpc_svc_name["0d72a7d4-6148-11d1-b4aa-00c04fb66ea0"] = "Cryptographic services";
  98. rpc_svc_pipes["d6d70ef0-0e3b-11cb-acc3-08002b1d29c4"] = "locator";
  99. rpc_svc_processes["d6d70ef0-0e3b-11cb-acc3-08002b1d29c4"] = "locator.exe";
  100. rpc_svc_name["d6d70ef0-0e3b-11cb-acc3-08002b1d29c4"] = "RPC Locator service";
  101. rpc_svc_pipes["342cfd40-3c6c-11ce-a893-08002b2e9c6d"] = "llsrpc";
  102. rpc_svc_processes["342cfd40-3c6c-11ce-a893-08002b2e9c6d"] = "llssrv.exe";
  103. rpc_svc_name["342cfd40-3c6c-11ce-a893-08002b2e9c6d"] = "License Logging service";
  104. rpc_svc_pipes["12345778-1234-abcd-ef00-0123456789ab"] = "lsass";
  105. rpc_svc_processes["12345778-1234-abcd-ef00-0123456789ab"] = "lsass.exe";
  106. rpc_svc_name["12345778-1234-abcd-ef00-0123456789ab"] = "LSA access";
  107. rpc_svc_pipes["3919286a-b10c-11d0-9ba8-00c04fd92ef5"] = "lsass";
  108. rpc_svc_processes["3919286a-b10c-11d0-9ba8-00c04fd92ef5"] = "lsass.exe";
  109. rpc_svc_name["3919286a-b10c-11d0-9ba8-00c04fd92ef5"] = "LSA DS access";
  110. rpc_svc_pipes["5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc"] = "ntsvcs";
  111. rpc_svc_processes["5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc"] = "messenger";
  112. rpc_svc_name["5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc"] = "Messenger service";
  113. rpc_svc_pipes["4fc742e0-4a10-11cf-8273-00aa004ae673"] = "netdfs";
  114. rpc_svc_processes["4fc742e0-4a10-11cf-8273-00aa004ae673"] = "Dfssvc";
  115. rpc_svc_name["4fc742e0-4a10-11cf-8273-00aa004ae673"] = "Distributed File System service";
  116. rpc_svc_pipes["12345678-1234-abcd-ef00-01234567cffb"] = "lsass";
  117. rpc_svc_processes["12345678-1234-abcd-ef00-01234567cffb"] = "Netlogon";
  118. rpc_svc_name["12345678-1234-abcd-ef00-01234567cffb"] = "Net Logon service";
  119. rpc_svc_pipes["8d9f4e40-a03d-11ce-8f69-08003e30051b"] = "ntsvcs";
  120. rpc_svc_processes["8d9f4e40-a03d-11ce-8f69-08003e30051b"] = "services.exe";
  121. rpc_svc_name["8d9f4e40-a03d-11ce-8f69-08003e30051b"] = "Plug and Play service";
  122. rpc_svc_pipes["d335b8f6-cb31-11d0-b0f9-006097ba4e54"] = "policyagent";
  123. rpc_svc_processes["d335b8f6-cb31-11d0-b0f9-006097ba4e54"] = "PolicyAgent";
  124. rpc_svc_name["d335b8f6-cb31-11d0-b0f9-006097ba4e54"] = "IPSEC Policy Agent (Windows 2000)";
  125. rpc_svc_pipes["12345678-1234-abcd-ef00-0123456789ab"] = "ipsec";
  126. rpc_svc_processes["12345678-1234-abcd-ef00-0123456789ab"] = "PolicyAgent";
  127. rpc_svc_name["12345678-1234-abcd-ef00-0123456789ab"] = "IPsec Services";
  128. rpc_svc_pipes["369ce4f0-0fdc-11d3-bde8-00c04f8eee78"] = "ProfMapApi";
  129. rpc_svc_processes["369ce4f0-0fdc-11d3-bde8-00c04f8eee78"] = "winlogon.exe";
  130. rpc_svc_name["369ce4f0-0fdc-11d3-bde8-00c04f8eee78"] = "Userenv";
  131. rpc_svc_pipes["c9378ff1-16f7-11d0-a0b2-00aa0061426a"] = "protected_storage";
  132. rpc_svc_processes["c9378ff1-16f7-11d0-a0b2-00aa0061426a"] = "lsass.exe";
  133. rpc_svc_name["c9378ff1-16f7-11d0-a0b2-00aa0061426a"] = "Protected Storage";
  134. rpc_svc_pipes["8f09f000-b7ed-11ce-bbd2-00001a181cad"] = "ROUTER";
  135. rpc_svc_processes["8f09f000-b7ed-11ce-bbd2-00001a181cad"] = "mprdim.dll";
  136. rpc_svc_name["8f09f000-b7ed-11ce-bbd2-00001a181cad"] = "Remote Access";
  137. rpc_svc_pipes["12345778-1234-abcd-ef00-0123456789ac"] = "lsass";
  138. rpc_svc_processes["12345778-1234-abcd-ef00-0123456789ac"] = "lsass.exe";
  139. rpc_svc_name["12345778-1234-abcd-ef00-0123456789ac"] = "SAM access";
  140. rpc_svc_pipes["93149ca2-973b-11d1-8c39-00c04fb984f9"] = "scerpc";
  141. rpc_svc_processes["93149ca2-973b-11d1-8c39-00c04fb984f9"] = "services.exe";
  142. rpc_svc_name["93149ca2-973b-11d1-8c39-00c04fb984f9"] = "Security Configuration Editor (SCE)";
  143. rpc_svc_pipes["12b81e99-f207-4a4c-85d3-77b42f76fd14"] = "SECLOGON";
  144. rpc_svc_processes["12b81e99-f207-4a4c-85d3-77b42f76fd14"] = "seclogon";
  145. rpc_svc_name["12b81e99-f207-4a4c-85d3-77b42f76fd14"] = "Secondary logon service";
  146. rpc_svc_pipes["83da7c00-e84f-11d2-9807-00c04f8ec850"] = "SfcApi";
  147. rpc_svc_processes["83da7c00-e84f-11d2-9807-00c04f8ec850"] = "winlogon.exe";
  148. rpc_svc_name["83da7c00-e84f-11d2-9807-00c04f8ec850"] = "Windows File Protection";
  149. rpc_svc_pipes["12345678-1234-abcd-ef00-0123456789ab"] = "spoolss";
  150. rpc_svc_processes["12345678-1234-abcd-ef00-0123456789ab"] = "spoolsv.exe";
  151. rpc_svc_name["12345678-1234-abcd-ef00-0123456789ab"] = "Spooler service";
  152. rpc_svc_pipes["4b324fc8-1670-01d3-1278-5a47bf6ee188"] = "ntsvcs";
  153. rpc_svc_processes["4b324fc8-1670-01d3-1278-5a47bf6ee188"] = "lsass.exe";
  154. rpc_svc_name["4b324fc8-1670-01d3-1278-5a47bf6ee188"] = "Server service";
  155. rpc_svc_pipes["4b112204-0e19-11d3-b42b-0000f81feb9f"] = "ssdpsrv";
  156. rpc_svc_processes["4b112204-0e19-11d3-b42b-0000f81feb9f"] = "ssdpsrv";
  157. rpc_svc_name["4b112204-0e19-11d3-b42b-0000f81feb9f"] = "SSDP service";
  158. rpc_svc_pipes["367aeb81-9844-35f1-ad32-98f038001003"] = "ntsvcs";
  159. rpc_svc_processes["367aeb81-9844-35f1-ad32-98f038001003"] = "services.exe";
  160. rpc_svc_name["367aeb81-9844-35f1-ad32-98f038001003"] = "Services control manager";
  161. rpc_svc_pipes["2f5f6520-ca46-1067-b319-00dd010662da"] = "tapsrv";
  162. rpc_svc_processes["2f5f6520-ca46-1067-b319-00dd010662da"] = "Tapisrv";
  163. rpc_svc_name["2f5f6520-ca46-1067-b319-00dd010662da"] = "Telephony service";
  164. rpc_svc_pipes["300f3532-38cc-11d0-a3f0-0020af6b0add"] = "trkwks";
  165. rpc_svc_processes["300f3532-38cc-11d0-a3f0-0020af6b0add"] = "Trkwks";
  166. rpc_svc_name["300f3532-38cc-11d0-a3f0-0020af6b0add"] = "Distributed Link Tracking Client";
  167. rpc_svc_pipes["8fb6d884-2388-11d0-8c35-00c04fda2795"] = "ntsvcs";
  168. rpc_svc_processes["8fb6d884-2388-11d0-8c35-00c04fda2795"] = "w32time";
  169. rpc_svc_name["8fb6d884-2388-11d0-8c35-00c04fda2795"] = "Windows Time (Windows 2000 and XP)";
  170. rpc_svc_pipes["8fb6d884-2388-11d0-8c35-00c04fda2795"] = "W32TIME_ALT";
  171. rpc_svc_processes["8fb6d884-2388-11d0-8c35-00c04fda2795"] = "w32time";
  172. rpc_svc_name["8fb6d884-2388-11d0-8c35-00c04fda2795"] = "Windows Time (Windows Server 2003)";
  173. rpc_svc_pipes["a002b3a0-c9b7-11d1-ae88-0080c75e4ec1"] = "winlogonrpc";
  174. rpc_svc_processes["a002b3a0-c9b7-11d1-ae88-0080c75e4ec1"] = "winlogon.exe";
  175. rpc_svc_name["a002b3a0-c9b7-11d1-ae88-0080c75e4ec1"] = "Winlogon";
  176. rpc_svc_pipes["338cd001-2244-31f1-aaaa-900038001003"] = "winreg";
  177. rpc_svc_processes["338cd001-2244-31f1-aaaa-900038001003"] = "RemoteRegistry";
  178. rpc_svc_name["338cd001-2244-31f1-aaaa-900038001003"] = "Remote registry service";
  179. rpc_svc_pipes["45f52c28-7f9f-101a-b52b-08002b2efabe"] = "winspipe";
  180. rpc_svc_processes["45f52c28-7f9f-101a-b52b-08002b2efabe"] = "wins.exe";
  181. rpc_svc_name["45f52c28-7f9f-101a-b52b-08002b2efabe"] = "WINS service";
  182. rpc_svc_pipes["6bffd098-a112-3610-9833-46c3f87e345a"] = "ntsvcs";
  183. rpc_svc_processes["6bffd098-a112-3610-9833-46c3f87e345a"] = "lsass.exe";
  184. rpc_svc_name["6bffd098-a112-3610-9833-46c3f87e345a"] = "Workstation service";
  185.  
  186. #---------------------------------------------------------------------#
  187.  
  188. #
  189. # String from a buffer. Inverts the bytes.
  190. #
  191.  
  192. function istring_from_buffer(b, start, end)
  193. {
  194.   __ret = "";
  195.   for (__i = start; __i <= end; __i = __i + 1)
  196.   {
  197.     __hx = hex(ord(b[__i]));
  198.     __hx = __hx - string("0x");
  199.     # ouch, would drop zeros without string
  200.     __ret = string(__hx, __ret);
  201.   }
  202.   return (__ret);
  203. }
  204.  
  205. #
  206. # String from a buffer. Straight.
  207. #
  208.  
  209. function string_from_buffer(b, start, end)
  210. {
  211.   __ret = "";
  212.   for (__i = start; __i <= end; __i = __i + 1)
  213.   {
  214.     __hx = hex(ord(b[__i]));
  215.     __hx = __hx - string("0x");
  216.     # ouch, would drop zeros without string
  217.     __ret = string(__ret, __hx);
  218.   }
  219.   return (__ret);
  220. }
  221.  
  222. #
  223. # Return the GUID/UUID as something printable
  224. #
  225. # Binary format of UUIDs is as follows:
  226. #   4 bytes  TL (time low)
  227. #   2 bytes  TM (time middle)
  228. #   2 bytes  TH (time high + version)
  229. #   1 byte   CH (clock seq high + reserved)
  230. #   1 byte   CL (clock seq low)
  231. #   6 bytes  NI (node id)
  232. # TL, TM, and TH are interpreted as little endian numbers...
  233. # or (surprise) as big endian numbers depending on the endianness flag
  234. # in PDU header, the location in PDU (header, body), the phase of moon
  235. # and other things; internally, we use LE format.
  236. #
  237. # Text format is as follows:
  238. #   TL-TM-TH-CHCL-NI[0]NI[1]..NI[5]
  239. # where all values are formatted as zero-padded base-16 numbers.
  240. #
  241.  
  242. function struuid(uuid)
  243. {
  244.   _bTL = istring_from_buffer(b:uuid, start:0, end:3);
  245.   _bTM = istring_from_buffer(b:uuid, start:4, end:5);
  246.   _bTH = istring_from_buffer(b:uuid, start:6, end:7);
  247.   _bCx = string_from_buffer(b:uuid, start:8, end:9);
  248.   _bNI = string_from_buffer(b:uuid, start:10, end:15);
  249.   return (_bTL + "-" + _bTM + "-" + _bTH + "-" + _bCx + "-" + _bNI); 
  250. }
  251.  
  252. #
  253. # Prepare DCE BIND request
  254. #
  255.  
  256. function dce_bind()
  257.   # Endpoint mapper UUID:
  258.   #   E1AF8308-5D1F-11C9-91A4-08002B14A0FA
  259.   ep_uuid = raw_string(
  260.       0x08, 0x83, 0xAF, 0xE1, 0x1F, 0x5D, 0xC9, 0x11,
  261.       0x91, 0xA4, 0x08, 0x00, 0x2B, 0x14 ,0xA0, 0xFA);
  262.   ep_vers = raw_string(0x03, 0x00, 0x00, 0x00);
  263.  
  264.   # Transfer syntar UUID:
  265.   #   8A885D04-1CEB-11C9-9FE8-08002B104860
  266.   ts_uuid = raw_string(
  267.       0x04, 0x5D, 0x88, 0x8A, 0xEB, 0x1C, 0xC9, 0x11,
  268.       0x9F, 0xE8, 0x08, 0x00, 0x2B, 0x10, 0x48, 0x60);  
  269.   ts_vers = raw_string(0x02, 0x00, 0x00, 0x00);
  270.  
  271.   # Request header
  272.   req_hdr = raw_string(
  273.       0x05, 0x00,              # version, minor version
  274.       0x0b, 0x00,              # BINDPACKET, flags
  275.       0x10, 0x00, 0x00, 0x00,  # data representation
  276.       0x48, 0x00,              # fragment length
  277.       0x00, 0x00,              # auth length
  278.       0x01, 0x00, 0x00, 0x00,  # call id
  279.       0x00, 0x10, 0x00, 0x10,  # max xmit frag, max recv frag
  280.       0x00, 0x00, 0x00, 0x00,  # assoc group
  281.       0x01,                    # num ctx items
  282.       0x00, 0x00, 0x00,        # (padding)
  283.       0x00, 0x00,              # p_cont_id
  284.       0x01,                    # n_transfer_syn
  285.       0x00);                   # (padding)
  286.  
  287.   return (string(
  288.       req_hdr, ep_uuid, ep_vers, ts_uuid, ts_vers));
  289. }
  290.  
  291. #
  292. # Prepare Endpoint Mapper enumeration request
  293. #
  294.  
  295. function dce_enum_get_next(callid, handle)
  296. {
  297.   _c0 = callid % 255;
  298.  
  299.   # Request header
  300.   req_hdr = raw_string(
  301.       0x05, 0x00,              # version, minor version
  302.       0x00, 0x03,              # REQUESTPACKET, flags
  303.       0x10, 0x00, 0x00, 0x00,  # data representation
  304.       0x40, 0x00,              # fragment length
  305.       0x00, 0x00,              # auth length
  306.       _c0,  0x00, 0x00, 0x00,  # call id
  307.       0x00, 0x00, 0x00, 0x00,  # alloc hint
  308.       0x00, 0x00,              # context id
  309.       0x02, 0x00,              # opnum: EPT_LOOKUP
  310.       0x00, 0x00, 0x00, 0x00,  # inquiry_type: RPC_C_EP_ALL_ELTS
  311.       0x00, 0x00, 0x00, 0x00,  # object
  312.       0x00, 0x00, 0x00, 0x00,  # interface_id
  313.       0x00, 0x00, 0x00, 0x00,  # vers_option
  314.       0x00, 0x00, 0x00, 0x00); # entry_handle.attributes
  315.  
  316.   # Request trailer
  317.   req_tlr = raw_string(
  318.       0x01, 0x00, 0x00, 0x00); # max_ents
  319.  
  320.   return (string(
  321.       req_hdr, handle, req_tlr));
  322. }
  323.  
  324. #
  325. # Extract integer values from buffers
  326. #
  327. # These functions should be NASL builtins... :(
  328. #
  329.  
  330. little_endian = 1;
  331.  
  332. function load_long(b, t)
  333. {
  334.   if (little_endian) {
  335.     __ret_lo_lo = ord(b[t]);
  336.     __ret_hi_lo = ord(b[t+1]) * 256;
  337.     __ret_lo_hi = ord(b[t+2]) * 65536;
  338.     __ret_hi_hi = ord(b[t+3]) * 16777216;
  339.   }
  340.   else {
  341.     __ret_lo_lo = ord(b[t+3]);
  342.     __ret_hi_lo = ord(b[t+2]) * 256;
  343.     __ret_lo_hi = ord(b[t+1]) * 65536;
  344.     __ret_hi_hi = ord(b[t]) * 16777216;
  345.   }
  346.   __ret = __ret_hi_hi + __ret_lo_hi + __ret_hi_lo + __ret_lo_lo;
  347.   return (__ret);
  348. }
  349.  
  350. function load_short(b, t)
  351. {
  352.   if (little_endian) {
  353.     __ret_lo = ord(b[t]);
  354.     __ret_hi = ord(b[t+1]) * 256;
  355.   }
  356.   else {
  357.     __ret_lo = ord(b[t+1]);
  358.     __ret_hi = ord(b[t]) * 256;
  359.   }
  360.   __ret = __ret_hi + __ret_lo;
  361.   return (__ret);
  362. }
  363.  
  364. function load_short_le(b, t)
  365. {
  366.   __ret_lo = ord(b[t]);
  367.   __ret_hi = ord(b[t+1]) * 256;
  368.   __ret  = __ret_hi + __ret_lo;
  369.   return (__ret);
  370. }
  371.  
  372. function load_short_be(b, t)
  373. {
  374.   __ret_lo = ord(b[t+1]);
  375.   __ret_hi = ord(b[t]) * 256;
  376.   __ret  = __ret_hi + __ret_lo;
  377.   return (__ret);
  378. }
  379.  
  380. #
  381. # Extract UUID from buffer
  382. #
  383.  
  384. function load_uuid_le(b, t)
  385. {
  386.   __ret = "";
  387.   for (__i = 0; __i < 16; __i = __i + 1) {
  388.     # ouch, would drop zero bytes without raw_string
  389.     __ret = string(__ret, raw_string(ord(b[t + __i])));
  390.   }
  391.   return (__ret);
  392. }
  393.  
  394. function load_uuid(b, t)
  395. {
  396.   __ret = "";
  397.   if (little_endian) {
  398.     __ret = load_uuid_le(b:b, t:t);
  399.   }
  400.   else {
  401.     __ret = string(__ret,
  402.     raw_string(ord(b[t + 3])), raw_string(ord(b[t + 2])),
  403.     raw_string(ord(b[t + 1])), raw_string(ord(b[t])),
  404.     raw_string(ord(b[t + 5])), raw_string(ord(b[t + 4])),
  405.     raw_string(ord(b[t + 7])), raw_string(ord(b[t + 6])));
  406.     for (__i = 8; __i < 16; __i = __i + 1) {
  407.       __ret = string(__ret, raw_string(ord(b[t + __i])));
  408.     }
  409.   }
  410.   return (__ret);
  411. }
  412.  
  413. #
  414. # Extract string from buffer
  415. # Unprintable characters are replaced with ?
  416. #
  417.  
  418. function load_string(b, t, l)
  419. {
  420.   __ret = "";
  421.   for (__i = 0; __i < l; __i = __i + 1) {
  422.     __c = ord(b[t + __i]);
  423.     if (__c == 0) return (__ret);
  424.     if ((__c < 32) || (__c > 127)) {
  425.       __ret = string(__ret, "?");
  426.     } else {
  427.       __ret = string(__ret, raw_string(__c));
  428.     }
  429.   }
  430.   return (__ret);
  431. }
  432.  
  433. #
  434. # Parse a response to an enumeration request
  435. #
  436.  
  437. function dce_parse(result)
  438. {
  439.   # Check whether we got RESPONSEPACKET
  440.   if (ord(result[2]) != 0x02) {
  441.     return (-1);
  442.   }
  443.  
  444.   # Update the context handle
  445.   hndatr = load_long(b:result, t:24);
  446.   handle = load_uuid(b:result, t:28);
  447.  
  448.   # Skip:
  449.   #   common DCE header (16 bytes)
  450.   #   alloc_hint, p_cont_id, cancel_count, padding (8 bytes)
  451.   #   context_handle.attributes (4 bytes)
  452.   #   context_handle.uuid (16 bytes)
  453.   #   num_elts (4 bytes) (should check != 0?)
  454.   #   "something" (36 bytes)
  455.   p = 84;
  456.  
  457.   # Annotation
  458.   tint = load_long(b:result, t:p);
  459.   p = p + 4;
  460.   if (tint > 64) {
  461.     return (-1);
  462.   }
  463.   annotation = load_string(b:result, t:p, l:tint);
  464.   p = p + tint;
  465.   while (p % 4 != 0) p = p + 1;
  466.  
  467.   # Skip tower lengths
  468.   p = p + 8;
  469.  
  470.   # Number of floors
  471.   floors = load_short_le(b:result, t:p);
  472.   p = p + 2;
  473.  
  474.   guid = "";
  475.   majver = "???";
  476.   proto = "???";
  477.   ncaproto = "???";
  478.   ncahost = "???";
  479.   ncaport = "???";
  480.   ncaunk = ""; # for undecoded floors
  481.  
  482.   # Analyze floors
  483.   for (floor = 1; floor <= floors; floor = floor + 1)
  484.   {
  485.     # Sanity check
  486.     if (p >= strlen(result) - 4) {
  487.       return (-1);
  488.     }
  489.  
  490.     # Floor part #1 (protocol identifier)
  491.     tint = load_short_le(b:result, t:p);
  492.     p = p + 2;
  493.     addr_type = ord(result[p]);
  494.     addr_data = string_from_buffer(b:result, start:p+1, end:p+tint-2);
  495.     if (floor == 1) {
  496.       # expecting addr_type == 0x0d (UUID_type_identifier), tint == 19
  497.       guid = load_uuid_le(b:result, t:p + 1);
  498.       guid = struuid(uuid:guid);
  499.       majver = load_short_le(b:result, t:p + 17);
  500.     }
  501.     p = p + tint;
  502.  
  503.     # Floor part #2 (related information)
  504.     tint = load_short_le(b:result, t:p);
  505.     p = p + 2;
  506.     # skip floors 1-3, expected contents:
  507.     #   floor #1: interface UUID (see above)
  508.     #   floor #2: transfer syntax UUID
  509.     #   floor #3: RPC connection-oriented/connectionless
  510.     if (floor > 3) {
  511.       decoded = 0;
  512.       if (addr_type == 0x01) {
  513.         # nonstandard NetBIOS name (string)
  514.         ncahost = "{0x01}" + load_string(b:result, t:p, l:tint);
  515.         decoded = 1;
  516.       }
  517.       if (addr_type == 0x07) {
  518.         # TCP port (2 bytes)
  519.         proto = "tcp";
  520.         ncaproto = "ncacn_ip_tcp:";
  521.         ncaport = load_short_be(b:result, t:p);
  522.         decoded = 1;
  523.       }
  524.       if (addr_type == 0x08) {
  525.         # UDP port (2 bytes)
  526.         proto = "udp";
  527.         ncaproto = "ncadg_ip_udp:";
  528.         ncaport = load_short_be(b:result, t:p);
  529.         decoded = 1;
  530.       }
  531.       if (addr_type == 0x09) {
  532.         # IP address (4 bytes)
  533.         ncahost = string(
  534.             ord(result[p]), ".", ord(result[p+1]), ".",
  535.             ord(result[p+2]), ".", ord(result[p+3]));
  536.         decoded = 1;
  537.       }
  538.       if (addr_type == 0x0f) {
  539.         # named pipe path (string)
  540.         proto = "PIPE";
  541.         ncaproto = "ncacn_np:";
  542.         ncaport = load_string(b:result, t:p, l:tint);
  543.         decoded = 1;
  544.       }
  545.       if (addr_type == 0x10) {
  546.         # LRPC port (string)
  547.         proto = "LRPC";
  548.         ncaproto = "ncalrpc";
  549.         ncahost = "";
  550.         ncaport = load_string(b:result, t:p, l:tint);
  551.         decoded = 1;
  552.       }
  553.       if (addr_type == 0x11) {
  554.         # NetBIOS name (string)
  555.         ncahost = load_string(b:result, t:p, l:tint);
  556.         decoded = 1;
  557.       }
  558.       if (addr_type == 0x16) {
  559.         # Appletalk DSP port (string)
  560.         proto = "APPLE-DSP";
  561.         ncaproto = "ncacn_at_dsp";
  562.         ncaport = load_string(b:result, t:p, l:tint);
  563.         decoded = 1;
  564.       }
  565.       if (addr_type == 0x17) {
  566.         # Appletalk DDP port (string?)
  567.         proto = "APPLE-DDP";
  568.         ncaproto = "ncadg_at_ddp";
  569.         ncaport = load_string(b:result, t:p, l:tint);
  570.         decoded = 1;
  571.       }
  572.       if (addr_type == 0x18) {
  573.         # Appletalk name (string)
  574.         ncahost = load_string(b:result, t:p, l:tint);
  575.         decoded = 1;
  576.       }
  577.       if (addr_type == 0x1f) {
  578.         # HTTP port (2 bytes)
  579.         proto = "tcp";
  580.         ncaproto = "ncacn_http:";
  581.         ncaport = load_short_be(b:result, t:p);
  582.         decoded = 1;
  583.       }
  584.       # seen in the wild, to be identified:
  585.       # - 0x0c (2 bytes)    broken IPX?
  586.       # - 0x0d (10 bytes)   broken IPX? (collision with UUID)
  587.       if (!decoded) {
  588.         ncaunk = string(
  589.             ncaunk, "{", hex(addr_type), "}", addr_data, ":",
  590.             string_from_buffer(b:result, start:p, end:p+tint-1));
  591.       }
  592.     }
  593.     p = p + tint;
  594.   }
  595.  
  596.   # Found a service
  597.   if (guid) {
  598.     report = report + string(
  599.         "     UUID: ", guid, ", version ", majver, "\n");
  600.     if (proto != "???")
  601.       report = report + string(
  602.         "     Endpoint: ", ncaproto, ncahost, "[", ncaport, "]\n");
  603.     if (ncaunk)
  604.       report = report + string(
  605.         "     Undecoded endpoint data: ", ncaunk, "\n");
  606.     if (annotation)
  607.       report = report + string(
  608.         "     Annotation: ", annotation, "\n");
  609.  
  610.     if ( rpc_svc_pipes[guid] ) 
  611.     report += string("     Named pipe : ", rpc_svc_pipes[guid], "\n");
  612.  
  613.     if ( rpc_svc_processes[guid] ) 
  614.     report += string("     Win32 service or process : ", rpc_svc_processes[guid], "\n");
  615.  
  616.     if ( rpc_svc_name[guid] ) 
  617.     report += string("     Description : ", rpc_svc_name[guid], "\n");
  618.  
  619.  
  620.     if ((proto == "udp") || (proto == "tcp"))
  621.     {
  622.     if(proto == "tcp")
  623.         {
  624.         register_service(port:ncaport, proto:string("DCE/", guid));
  625.         all_report_tcp[ncaport] += report + '\n';
  626.         }
  627.     else
  628.         all_report_udp[ncaport] += report + '\n';
  629.     }
  630.     else all_report_135 += report + '\n';
  631.     return (1);
  632.   }
  633.  
  634.   return (0);
  635. }
  636.  
  637. #
  638. # Receive a DCE message
  639. # this is much faster than recv(..., length:4096)
  640. #
  641.  
  642. function read_dce_pdu(sock)
  643. {
  644.   # Read response header
  645.   __r0 = recv(socket:sock, length:16);
  646.  
  647.   # Check length
  648.   if (strlen(__r0) != 16) {
  649.     return ("");
  650.   }
  651.  
  652.   # Check endianness
  653.   if (ord(__r0[4]) & 0xF0 == 0x10)
  654.     little_endian = 1;
  655.   else
  656.     little_endian = 0;
  657.  
  658.   # Extract fragment length and read the rest
  659.   __r1len = load_short(b:__r0, t:8) - 16;
  660.   __r1 = recv(socket:sock, length:__r1len);
  661.  
  662.   # Check length
  663.   if (strlen(__r1) != __r1len) {
  664.     return ("");
  665.   }
  666.  
  667.   # Concatenate the results...the safe way
  668.   __r = "";
  669.   for (__i = 0; __i < 16; __i = __i + 1)
  670.     __r = string(__r, raw_string(ord(__r0[__i])));
  671.   for (__i = 0; __i < __r1len; __i = __i + 1)
  672.     __r = string(__r, raw_string(ord(__r1[__i])));
  673.  
  674.   return (__r);
  675. }
  676.  
  677.  
  678. #---------------------------------------------------------------------#
  679.  
  680. #
  681. # The main program
  682. #
  683.  
  684. zero_handle = raw_string
  685.     (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  686.      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
  687.  
  688. handle = zero_handle;
  689.     
  690. if (get_port_state(135))
  691. {    
  692.   all_report_tcp = make_list();
  693.   all_report_udp = make_list();
  694.  
  695.   soc = open_sock_tcp(135);
  696.   if (!soc) exit(0);
  697.  
  698.   enum = 0;
  699.  
  700.   send(socket:soc, data:dce_bind());
  701.   r = read_dce_pdu(sock:soc);
  702.   if (strlen(r) < 60) exit(0); # bad reply length
  703.  
  704.   for (x = 0; x < 4096; x = x + 1)
  705.   {
  706.     send(socket:soc, data:dce_enum_get_next(callid:x, handle:handle));
  707.     r = read_dce_pdu(sock:soc);
  708.     if (strlen(r) <= 65) {
  709.       # finished
  710.       x = 4096;
  711.     }
  712.     else {
  713.       dce_parse(result:r);
  714.       enum = enum + 1;
  715.       if (handle == zero_handle) {
  716.         # finished
  717.         x = 4096;
  718.       }
  719.     }
  720.   }
  721.   close(soc);
  722.   if (enum) security_warning(135);
  723.  
  724.  
  725.   myprereport = string("Distributed Computing Environment (DCE) services running on the remote host
  726. can be enumerated by connecting on port 135 and doing the appropriate queries.
  727.  
  728. An attacker may use this fact to gain more knowledge
  729. about the remote host.
  730.  
  731.  
  732. Here is the list of DCE services running on this port:\n\n");
  733.  
  734.  
  735. mypostreport = string("
  736.  
  737. Solution : filter incoming traffic to this port.
  738. Risk factor : Low");
  739.  
  740.  
  741.  
  742.  
  743.  
  744.   if(!isnull(all_report_tcp))
  745.   {
  746.       foreach port (keys(all_report_tcp))
  747.         security_note(port:port, data:myprereport + all_report_tcp[port] + mypostreport);
  748.   }
  749.  
  750.   if(!isnull(all_report_udp))
  751.   {
  752.       foreach port (keys(all_report_udp))
  753.         security_note(port:port, data:myprereport + all_report_udp[port] + mypostreport, proto:"udp");
  754.  }
  755.   if(all_report_135 != NULL)
  756.     security_note(port:135, data:myprereport + all_report_135 + mypostreport);
  757.  
  758. }
  759.  
  760.